#include <string> 
#include "imageBMP.h"
#include <iostream>

imageBMP::imageBMP(void){
}

imageBMP::imageBMP(char *fichier){	
	traiterImage(fichier);
}


imageBMP::~imageBMP(void){
	for (int i = 0; i < infoImage.hauteurImg; i++)
		delete[] grille[i];
	delete[] grille;
}

void imageBMP::traiterImage(char *fichier){
	ifstream file(fichier, std::ios_base::binary);
	if(file){
		file.read((char*)&infoFichier.signature, 2);
		file.read((char*)&infoFichier.tailleFichier, 4);
		file.read((char*)&infoFichier.champReserve, 4);
		file.read((char*)&infoFichier.offsetImg, 4);
		
		file.read((char*)&infoImage.tailleEntete, 4);
		file.read((char*)&infoImage.largeurImg, 4);
		file.read((char*)&infoImage.hauteurImg, 4);
		file.read((char*)&infoImage.nbrPlan, 2);
		file.read((char*)&infoImage.profondeurCodageCouleur, 2);
		file.read((char*)&infoImage.compression, 4);
		file.read((char*)&infoImage.tailleImage, 4);
		file.read((char*)&infoImage.resHorizontale, 4);
		file.read((char*)&infoImage.resVerticale, 4);
		file.read((char*)&infoImage.nbrCouleur, 4);
		file.read((char*)&infoImage.nbrCouleurImportante, 4);

		file.seekg(infoFichier.offsetImg);

		grille = new int*[infoImage.hauteurImg];
		for (int i = 0; i < infoImage.hauteurImg; i++)
			grille[i] = new int[infoImage.largeurImg];
		
		int cptX = 0;
		int cptY = infoImage.hauteurImg-1;
		char nombre;
		
		for(int x=0 ; x<infoImage.hauteurImg ; x++){
			int y;
			for(y=0 ; y<infoImage.largeurImg ; y++){
				file.read(&nombre, 1);
				grille[y][x] = (int)nombre;
			}
			while(y%4 != 0){
				file.read(&nombre, 1);
				y++;
			}
		}
	}
	else
		printf("Impossible d'ouvrir le fichier\n");
}

int imageBMP::getWidth(void){
	return infoImage.largeurImg;
}

int imageBMP::getHeight(void){
	return infoImage.hauteurImg;
}

int imageBMP::getOffsetImg(void){
	return infoFichier.offsetImg;
}

int imageBMP::getSizeImg(void){
	return infoImage.tailleImage;
}
void imageBMP::afficheImg(void){
	for(int x=0; x<infoImage.hauteurImg; x++){
		for(int y=0; y<infoImage.largeurImg; y++){
			if(grille[x][y] == -1)
				std::cout << " ";
			else
				std::cout << "#";
		}
		std::cout << std::endl;
	}
	return;
}
int imageBMP::getPixel(int x, int y){
	if(x<0 || x>infoImage.largeurImg || y<0 || y>infoImage.hauteurImg){
		return -1;
	}
	return grille[x][y];
}